mlpfandomcom_ru-20200216-history
Модуль:PersBoxUnstable
local infoboxCharacter = {} --верхний уровень - группа инфобоксов function infoboxCharacter.blockCreate(frame) local args = frame.args --функции --разбиение строки на массив подстрок по определенному символу function split(str, separator, reg) local result = {} --Проверка на образец if (not reg) then regExp = true else regExp = false end --переменные позиций local n local k --управляющие переменные local s = 0 local i = 1 --обработка строки while k ~= str:len() do --поиск сепаратора local substring n, k = str:find(separator, s + 1, regExp) --если поиск не дал результатов if (k nil or n nil) then resulti = str:sub(s + 1, str:len()) break end --если сепаратор найден substring = str:sub(s + 1, n - 1) --добавление результата if substring ~= '' then resulti = substring i = i + 1 end s = k end return result end --проверка параметров function paramCheck(param) if param and param ~= '' then return true else return false end end --создание инфобокса function infoboxCreate(prefix) --обработка аргументов local data = {} --имя if paramCheck(argsprefix..'имя') then data.name = argsprefix..'имя' elseif prefix ~= '' then data.name = prefix:sub(1, prefix:len() - 1) else data.name = tostring(mw.title.getCurrentTitle()) end --титул if paramCheck(argsprefix..'титул') then data.title = argsprefix..'титул' end --возраст if paramCheck(argsprefix..'возраст') then data.age = mw.ustring.lower(argsprefix..'возраст') end --вид if paramCheck(argsprefix..'вид') then data.kind = mw.ustring.lower(argsprefix..'вид') end --пол if paramCheck(argsprefix..'пол') then data.gender = mw.ustring.lower(argsprefix..'пол') end --разная информация data.differentInfo = {} --занятие if paramCheck(argsprefix..'занятие') then data.differentInfo+ 1 = {'Занятие', argsprefix..'занятие'} end --место проживания if paramCheck(argsпроживания') then data.differentInfo+ 1 = {'Место проживания', argsпроживания'} end --остальная local dIC = 1 while paramCheck(argsинформация '..dIC) do local dInfo = split(argsинформация '..dIC, ':') if dInfo2 then data.differentInfo+ 1 = {dInfo1, dInfo2} end dIC = dIC + 1 end --озвучка data.voiceInfo = {} --русская if paramCheck(argsозвучка') then data.voiceInfo+ 1 = {'Русская', argsозвучка'} end --английская if paramCheck(argsозвучка') then data.voiceInfo+ 1 = {'Оригинальная', argsозвучка'} end --русская озвучка песен if paramCheck(argsозвучка песен') then data.voiceInfo+ 1 = {'Русская песен', argsозвучка песен'} end --английская озвучка песен if paramCheck(argsозвучка песен') then data.voiceInfo+ 1 = {'Оригинальная песен', argsозвучка песен'} end --другая local vIC = 1 while paramCheck(argsозвучка '..vIC) do local vInfo = split(argsозвучка '..vIC, ':') if vInfo2 then data.voiceInfo+ 1 = {vInfo1, vInfo2} end vIC = vIC + 1 end --родственники data.relativesInfo = {} local rIC = 1 while paramCheck(args'..rIC) do local rInfo = split(args'..rIC, ':') if rInfo2 then data.relativesInfo+ 1 = {rInfo1, rInfo2} end rIC = rIC + 1 end --цвета персонажа data.colorTable = {} if paramCheck(argsprefix..'окрас') then local colors = split(argsprefix..'окрас', '/') data.colorTable+ 1 = {'Окрас', colors} --предварительное определение цветовой схемы - фон data.bgColor = colors1 end if paramCheck(argsгривы') then local colors = split(argsгривы', '/') data.colorTable+ 1 = {'Грива', colors} --предварительное определение цветовой схемы - текст data.fontColor = colors1 end if paramCheck(argsглаз') then local colors = split(argsглаз', '/') data.colorTable+ 1 = {'Глаза', colors} end local ctc = 1 while argsцвет '..ctc do local color = split(argsцвет '..ctc, ':') if color2 then local parsedColor = split(color2, '/') data.colorTable+ 1 = {color1, parsedColor} end ctc = ctc + 1 end --метки data.cutieMarks = {} local cMC = 1 while paramCheck(argsметки '..cMC) or paramCheck(argsметки '..cMC) do data.cutieMarkscMC = {} --цвет фона if paramCheck(argsфона метки '..cMC) then data.cutieMarkscMC.cmBackground = argsфона метки '..cMC elseif data.bgColor then data.cutieMarkscMC.cmBackground = data.bgColor else data.cutieMarkscMC.cmBackground = 'inherit' end --размер if paramCheck(argsметки '..cMC) then data.cutieMarkscMC.cmSize = argsметки '..cMC else data.cutieMarkscMC.cmSize = '38x38px' end --изображение if paramCheck(argsметки '..cMC) then data.cutieMarkscMC.cmImage = argsметки '..cMC end --описание if paramCheck(argsметки '..cMC) then data.cutieMarkscMC.cmDescription = argsметки '..cMC end cMC = cMC + 1 end --цветовая тема --цвет фона if paramCheck(argsфона заголовка') then data.bgColor = argsфона заголовка' elseif not data.bgColor then data.bgColor = 'inherit' end --цвет текста if paramCheck(argsтекста заголовка') then data.fontColor = argsтекста заголовка' elseif not data.fontColor then data.fontColor = 'transparent' end --обёртка содержимого local infoboxOuter = mw.html.create('div') --основа инфобокса local infobox = mw.html.create('div') infoboxOuter:addClass('ib1_infoboxCharacter') --функции ---------------------------------------------------------- --создание изображений и кнопок (устаревшее) function imageCreateOld(name, dNone) local image = mw.html.create('div') image:addClass('infBlock') if not argsprefix..'титул' or argsprefix..'титул' '' then image:css('margin', '6px 0 0 0') end if dNone then image:css('display', 'none') end image:wikitext('[[Файл:'..argsname..'|250px|link=]]') return image end function buttonCreateOld(name) local button = mw.html.create('div') button:addClass('infButton') button:css('color', data.fontColor) button:css('background', data.bgColor) button:wikitext(argsname) return button end ------------------------------------------------------------- --создание плашек с информацией о поле и возрасте function kindGenderCreate(text, image) local label = mw.html.create('div') if image then local imgBlock = mw.html.create('div') imgBlock:wikitext('link=') label:css('padding-left', '23px') label:node(imgBlock) else label:css('padding-left', '3px') end label:wikitext(text) return label end --создание строки таблицы function lineCreate(title, text) local line = mw.html.create('tr') local leftColumn = mw.html.create('th') leftColumn:wikitext(title) line:node(leftColumn) local rightColumn = mw.html.create('td') rightColumn:wikitext(text) line:node(rightColumn) return line end --создание пустой сворачивающейся таблицы с заголовком function collapsibleTableCreate(label) local colTable = mw.html.create('table') colTable:addClass('mw-collapsible mw-collapsed') local headerLine = mw.html.create('tr') local header = mw.html.create('th') header:css('background-color', data.bgColor) header:css('color', data.fontColor) header:wikitext(label) header:attr('colspan', '6') headerLine:node(header) colTable:node(headerLine) return colTable end --Создание колорбокса function colorBoxCreate(colors, borderColor) local colorBox = mw.html.create('div') colorBox:addClass('infoboxCharacter_colorBox') if (borderColor) then colorBox:css('border', '2px solid '..borderColor) else colorBox:css('border', '1px solid gray') end width = 100 / #colors for i = 1, #colors do local innerElement = mw.html.create('div') innerElement:css('background-color', colorsi) innerElement:css('width', width..'%') innerElement:attr('title', colorsi) colorBox:node(innerElement) end return colorBox end --содержимое --заголовок local header = mw.html.create('div') header:addClass('infoboxCharacter_header') header:css('background-color', data.bgColor) local headerText = mw.html.create('div') headerText:wikitext(data.name ) headerText:css('color', data.fontColor) header:node(headerText) --титул local title if data.title then title = mw.html.create('div') title:addClass('infoboxCharacter_title') title:wikitext(data.title) end ------------------------------ --изображения и кнопки (устаревшие) local imgOld1, imgOld2, imgOld3, imgOld4, imgOld5, imgOld6, imgOld7, imgOld8, imgOld9, imgOld10 if paramCheck(argsprefix..'изображение') then imgOld1 = imageCreateOld(prefix..'изображение') end if paramCheck(argsprefix..'изображение2') then imgOld2 = imageCreateOld(prefix..'изображение2', true) end if paramCheck(argsprefix..'изображение3') then imgOld3 = imageCreateOld(prefix..'изображение3', true) end if paramCheck(argsprefix..'изображение4') then imgOld4 = imageCreateOld(prefix..'изображение4', true) end if paramCheck(argsprefix..'изображение5') then imgOld5 = imageCreateOld(prefix..'изображение5', true) end if paramCheck(argsprefix..'изображение6') then imgOld6 = imageCreateOld(prefix..'изображение6', true) end if paramCheck(argsprefix..'изображение7') then imgOld7 = imageCreateOld(prefix..'изображение7', true) end if paramCheck(argsprefix..'изображение8') then imgOld8 = imageCreateOld(prefix..'изображение8', true) end if paramCheck(argsprefix..'изображение9') then imgOld9 = imageCreateOld(prefix..'изображение9', true) end if paramCheck(argsprefix..'изображение10') then imgOld10 = imageCreateOld(prefix..'изображение10', true) end local butOld if paramCheck(argsprefix..'изображение2') then butOld = mw.html.create('div') butOld:cssText('width:100%; margin:6px 0 6px; text-align:center') butOld:node(buttonCreateOld(prefix..'подпись1')) butOld:node(buttonCreateOld(prefix..'подпись2')) if paramCheck(argsprefix..'изображение3') then butOld:node(buttonCreateOld(prefix..'подпись3')) end if paramCheck(argsprefix..'изображение4') then butOld:node(buttonCreateOld(prefix..'подпись4')) end if paramCheck(argsprefix..'изображение5') then butOld:node(buttonCreateOld(prefix..'подпись5')) end if paramCheck(argsprefix..'изображение6') then butOld:node(buttonCreateOld(prefix..'подпись6')) end if paramCheck(argsprefix..'изображение7') then butOld:node(buttonCreateOld(prefix..'подпись7')) end if paramCheck(argsprefix..'изображение8') then butOld:node(buttonCreateOld(prefix..'подпись8')) end if paramCheck(argsprefix..'изображение9') then butOld:node(buttonCreateOld(prefix..'подпись9')) end if paramCheck(argsprefix..'изображение10') then butOld:node(buttonCreateOld(prefix..'подпись10')) end end --------------------------- --вид и пол local kindGender if data.kind or data.gender then kindGender = mw.html.create('div') kindGender:addClass('infoboxCharacter_kindGender colorlink') local customKind --вид if data.kind then local kind = mw.html.create('div') local textKind local kindImg if data.kind 'единорог' then textKind = 'Единорог' kindImg = 'Unicorn picto' elseif data.kind 'пегас' then textKind = 'Пегас' kindImg = 'Pegasus picto' elseif data.kind 'земнопони' or data.kind 'земной пони' or data.kind 'земная пони' then if data.gender and data.gender 'жен' then textKind = 'Земная пони' else textKind = 'Земной пони' end kindImg = 'Earthpony picto' elseif data.kind 'аликорн' then textKind = 'Аликорн' kindImg = 'Alicorn picto' else textKind = data.kind customKind = true end local kind = kindGenderCreate(textKind, kindImg) kindGender:node(kind) end --пол if data.gender and data.gender 'муж' or data.gender 'жен' then local gender = mw.html.create("div") local genderText local genderImg if data.gender 'муж' or data.gender 'мужской' then if customKind then genderText = 'Муж.' elseif data.age 'дет' then genderText = 'Жеребёнок' else genderText = 'Жеребец' end genderImg = 'Male picto' else if customKind then genderText = 'Жен.' elseif data.age 'дет' then genderText = 'Кобылка' else genderText = 'Кобыла' end genderImg = 'Female picto' end local gender = kindGenderCreate(genderText, genderImg) kindGender:node(gender) end end --разная информация local diffInfoTable if #data.differentInfo ~= 0 then diffInfoTable = mw.html.create('table') diffInfoTable:addClass('infoboxCharacter_infoTable') for i = 1, #data.differentInfo do local line = lineCreate(data.differentInfoi1, data.differentInfoi2) diffInfoTable:node(line) end end --озвучка local voiceTable if #data.voiceInfo ~= 0 then voiceTable = collapsibleTableCreate('Озвучка') voiceTable:addClass('infoboxCharacter_collapsibleInfoTable') for i = 1, #data.voiceInfo do local line = lineCreate(data.voiceInfoi1, data.voiceInfoi2) voiceTable:node(line) end end --родственники local relativesTable if #data.relativesInfo ~= 0 then relativesTable = collapsibleTableCreate('Родственники') relativesTable:addClass('infoboxCharacter_collapsibleInfoTable') for i = 1, #data.relativesInfo do local line = lineCreate(data.relativesInfoi1, data.relativesInfoi2) relativesTable:node(line) end end --внешний вид local appearanceTable if data.colorTable1 or data.cmImage or data.cmDescription then appearanceTable = collapsibleTableCreate('Внешний вид') appearanceTable:addClass('infoboxCharacter_appearanceTable') --цвета if data.colorTable1 then local length = #data.colorTable local colspan local tr for i = 1, length do if length - i 1 and length % 3 2 then colspan = '3' elseif length - i 0 and length % 3 1 then colspan = '6' else colspan = '2' end if i % 3 1 then tr = mw.html.create('tr') end local th = mw.html.create('th') th:attr('colspan', colspan) th:wikitext(data.colorTablei1..' ') local colorBox = colorBoxCreate(data.colorTablei2) th:node(colorBox) tr:node(th) if (i % 3 0 or length - i 0) then appearanceTable:node(tr) end end end --метка if #data.cutieMarks > 0 then local tr = mw.html.create('tr') local td = mw.html.create('td') td:attr("colspan", "6") local label = mw.html.create('span') label:wikitext('Метка') --кнопки local rButton if #data.cutieMarks > 1 then --левая local lButton = mw.html.create('div') lButton:addClass('ib1_appearance_lButton ib1_cmButton') lButton:css('background-color', data.bgColor) lButton:attr('title', 'Предыдущая метка') local lArrow = mw.html.create('div') lArrow:css('border-right-color', data.fontColor) lButton:node(lArrow) --добавление левой td:node(lButton) --правая rButton = mw.html.create('div') rButton:addClass('ib1_appearance_rButton ib1_cmButton') rButton:css('background-color', data.bgColor) rButton:attr('title', 'Следующая метка') local rArrow = mw.html.create('div') rArrow:css('border-left-color', data.fontColor) rButton:node(rArrow) end --описание и картинка for i = 1, #data.cutieMarks do --описание local description if data.cutieMarksi.cmDescription then description = mw.html.create('div') description:node(label) description:wikitext(' '..data.cutieMarksi.cmDescription) end --изображение local image if data.cutieMarksi.cmImage then image = mw.html.create('div') image:wikitext('[[файл:'..data.cutieMarksi.cmImage..'|'..data.cutieMarksi.cmSize..'|link=]]') image:css("background-color", data.cutieMarksi.cmBackground) end --обертка local wrapper if description and image then wrapper = mw.html.create('div') wrapper:addClass('ib1_appearance_cmComplete ib1_cm') wrapper:node(description) wrapper:node(image) elseif description then wrapper = description wrapper:addClass('ib1_appearance_cmDescription ib1_cm') else wrapper = mw.html.create('div') wrapper:node(label) wrapper:node(image) wrapper:addClass('ib1_appearance_cmImage ib1_cm') end --сокрытие лишних меток if i > 1 then wrapper:css('display', 'none') end --добавление td:node(wrapper) end --добавление правой кнопки if rButton then td:node(rButton) end tr:node(td) appearanceTable:node(tr) end end --галерея local gallery if paramCheck(argsprefix..'галерея') then gallery = mw.html.create('div') gallery:addClass('infoboxCharacter_gallery colorlink') gallery:css('color', data.fontColor) gallery:css('background-color', data.bgColor) gallery:wikitext('[['..argsprefix..'галерея'..'|Галерея]]') end --построение infobox:node(header) if title then infobox:node(title) end ---------------------------------- --изображения и кнопки (устаревшие) if imgOld1 then infobox:node(imgOld1) end if imgOld2 then infobox:node(imgOld2) end if imgOld3 then infobox:node(imgOld3) end if imgOld4 then infobox:node(imgOld4) end if imgOld4 then infobox:node(imgOld5) end if imgOld4 then infobox:node(imgOld6) end if imgOld4 then infobox:node(imgOld7) end if imgOld4 then infobox:node(imgOld8) end if imgOld4 then infobox:node(imgOld9) end if imgOld4 then infobox:node(imgOld10) end if butOld then infobox:node(butOld) end ------------------------------- if kindGender then infobox:node(kindGender) end if diffInfoTable then infobox:node(diffInfoTable) end if voiceTable then infobox:node(voiceTable) end if relativesTable then infobox:node(relativesTable) end if appearanceTable then infobox:node(appearanceTable) end if gallery then infobox:node(gallery) end infoboxOuter:node(infobox) return {infoboxOuter, data} end --создание блока инфобоксов function infoboxBlockCreate() --создание --обертка local infoboxBlock = mw.html.create('div') infoboxBlock:addClass('ib1_ibBlock') --инфобоксы local infoboxes = {} if args1' then local ibC = 1 while args'..ibC do infoboxesibC = infoboxCreate(args'..ibC..' ') infoboxesibC1:attr('data-name', infoboxesibC2.name) infoboxesibC1:attr('data-bgcolor', infoboxesibC2.bgColor) infoboxesibC1:attr('data-fontcolor', infoboxesibC2.fontColor) if ibC > 1 then infoboxesibC1:css('display', 'none') end ibC = ibC + 1 end else infoboxes1 = infoboxCreate('') end --управляющие кнопки local buttonsContainer if #infoboxes > 1 then buttonsContainer = mw.html.create('div') buttonsContainer:addClass('ib1_cb_block') local prevKey = mw.html.create('div') prevKey:wikitext(infoboxes#infoboxes2.name) prevKey:css('background-color', infoboxes#infoboxes2.bgColor) prevKey:css('color', infoboxes#infoboxes2.fontColor) buttonsContainer:node(prevKey) if #infoboxes > 2 then local nextKey = mw.html.create('div') nextKey:wikitext(infoboxes22.name) nextKey:css('background-color', infoboxes22.bgColor) nextKey:css('color', infoboxes22.fontColor) buttonsContainer:node(nextKey) end end --построение --управляющие кнопки if buttonsContainer then infoboxBlock:node(buttonsContainer) end --инфобоксы for i = 1, #infoboxes do infoboxBlock:node(infoboxesi1) end return infoboxBlock end return infoboxBlockCreate() end return infoboxCharacter